3ddb79c25UE59iu4JJcbRalx95mvcg xen/include/hypervisor-ifs/hypervisor-if.h
3ead095dE_VF-QA88rl_5cWYRWtRVQ xen/include/hypervisor-ifs/kbd.h
3ddb79c2oRPrzClk3zbTkRHlpumzKA xen/include/hypervisor-ifs/network.h
+3f0d22cbroqp_BkoDPwkfRJhaw1LiQ xen/include/hypervisor-ifs/segment.h
3ddb79c4qbCoOFHrv9sCGshbWzBVlQ xen/include/scsi/scsi.h
3ddb79c4R4iVwqIIeychVQYmIH4FUg xen/include/scsi/scsi_ioctl.h
3ddb79c4yw_mfd4Uikn3v_IOPRpa1Q xen/include/scsi/scsicam.h
tools/internal/xi_phys_grant.c~
tools/internal/xi_phys_probe.c~
tools/internal/xi_phys_revoke.c~
+xen/include/hypervisor-ifs/segment.h~
make_response(p, blk_ring->ring[index].req.id, XEN_BLOCK_PROBE_BLK, rc);
}
-static void dispatch_probe_seg_common(struct task_struct *p,
- struct task_struct *target,
- int type,
- int index)
+static void dispatch_probe_seg(struct task_struct *p,
+ int index)
{
extern void xen_segment_probe(struct task_struct *, xen_disk_info_t *);
spin_unlock_irqrestore(&p->page_lock, flags);
xdi = phys_to_virt(buffer);
- xen_segment_probe(target, xdi);
+ xen_segment_probe(p, xdi);
unlock_buffer(p, buffer, sizeof(xen_disk_info_t), 1);
out:
- make_response(p, blk_ring->ring[index].req.id, type, rc);
-}
-
-static void dispatch_probe_seg(struct task_struct *p, int index)
-{
- dispatch_probe_seg_common(p, p, XEN_BLOCK_PROBE_SEG, index);
+ make_response(p, blk_ring->ring[index].req.id, XEN_BLOCK_PROBE_SEG, rc);
}
static void dispatch_probe_seg_all(struct task_struct *p, int index)
{
- dispatch_probe_seg_common(p, NULL, XEN_BLOCK_PROBE_SEG_ALL, index);
+ extern void xen_segment_probe_all(xen_segment_info_t *);
+
+ blk_ring_t *blk_ring = p->blk_ring_base;
+ xen_segment_info_t *xsi;
+ unsigned long flags, buffer;
+ int rc = 0;
+
+ buffer = blk_ring->ring[index].req.buffer_and_sects[0] & ~0x1FF;
+
+ spin_lock_irqsave(&p->page_lock, flags);
+ if ( !__buffer_is_valid(p, buffer, sizeof(xen_segment_info_t), 1) )
+ {
+ DPRINTK("Bad buffer in dispatch_probe_seg_all\n");
+ spin_unlock_irqrestore(&p->page_lock, flags);
+ rc = 1;
+ goto out;
+ }
+ __lock_buffer(buffer, sizeof(xen_segment_info_t), 1);
+ spin_unlock_irqrestore(&p->page_lock, flags);
+
+ xsi = phys_to_virt(buffer);
+ xen_segment_probe_all(xsi);
+
+ unlock_buffer(p, buffer, sizeof(xen_segment_info_t), 1);
+
+ out:
+ make_response(p, blk_ring->ring[index].req.id, XEN_BLOCK_PROBE_SEG_ALL, rc);
}
static void dispatch_rw_block_io(struct task_struct *p, int index)
for ( loop = 0; loop < XEN_MAX_SEGMENTS; loop++ )
{
if ( (xsegments[loop].mode == XEN_SEGMENT_UNUSED) ||
- (p && xsegments[loop].domain != p->domain) )
+ (xsegments[loop].domain != p->domain) )
continue;
device = MK_VIRTUAL_XENDEV(xsegments[loop].segment_number);
unmap_domain_mem(xdi);
}
+/*
+ * xen_segment_probe_all
+ *
+ * return a list of all segments to domain 0
+ */
+void xen_segment_probe_all(xen_segment_info_t *raw_xsi)
+{
+ int loop;
+ xen_segment_info_t *xsi = map_domain_mem(virt_to_phys(raw_xsi));
+ unsigned long device;
+
+ xsi->count = 0;
+ for ( loop = 0; loop < XEN_MAX_SEGMENTS; loop++ )
+ {
+ if ( xsegments[loop].mode == XEN_SEGMENT_UNUSED )
+ continue;
+
+ device = MK_VIRTUAL_XENDEV(xsegments[loop].segment_number);
+
+ printk("Doing seg %d.\n", xsi->count);
+ xsi->segments[xsi->count].device = device;
+ xsi->segments[xsi->count].domain = xsegments[loop].domain;
+ memcpy(xsi->segments[xsi->count].key,
+ xsegments[loop].key,
+ XEN_SEGMENT_KEYSIZE);
+ xsi->segments[xsi->count].seg_nr = xsegments[loop].segment_number;
+ printk("Done.\n");
+ xsi->count++;
+ }
+
+ unmap_domain_mem(xsi);
+}
+
/*
* xen_refresh_segment_list
*
xsegments[idx].mode = xvd->mode;
xsegments[idx].domain = xvd->domain;
xsegments[idx].segment_number = xvd->segment;
+ memcpy(xsegments[idx].key, xvd->key, XEN_SEGMENT_KEYSIZE);
xsegments[idx].num_extents = xvd->ext_count;
xsegments[idx].extents = (extent_t *)kmalloc(
sizeof(extent_t)*xvd->ext_count,
unsigned long size; /* size in blocks */
} xv_extent_t;
+#define XEN_SEGMENT_KEYSIZE 10
+
typedef struct xv_disk
{
int mode; /* XEN_DISK_READ_WRITE or XEN_DISK_READ_ONLY */
int domain; /* domain */
int segment; /* segment number */
+ char key[XEN_SEGMENT_KEYSIZE]; /* key for benefit of dom0 userspace */
int ext_count; /* number of xv_extent_t to follow */
xv_extent_t extents[XEN_MAX_DISK_COUNT]; /* arbitrary reuse of constant */
} xv_disk_t;
--- /dev/null
+#ifndef __HYP_IFS_SEGMENT_H__
+#define __HYP_IFS_SEGMENT_H__
+
+#define XEN_MAX_SEGMENTS 100 /* total number of segments across all doms */
+
+typedef struct xen_segment_info
+{
+ int count;
+ struct {
+ unsigned domain;
+ unsigned seg_nr;
+ char key[XEN_SEGMENT_KEYSIZE];
+ unsigned short device;
+ } segments[XEN_MAX_SEGMENTS];
+} xen_segment_info_t;
+
+#endif /* __HYP_IFS_SEGMENT_H__ */
#define __SEGMENT_H__
#include <hypervisor-ifs/block.h>
+#include <hypervisor-ifs/segment.h>
/* Describes a physical disk extent. */
typedef struct {
unsigned long buffer;
} phys_seg_t;
+struct task_struct;
+
void xen_segment_initialize(void);
void xen_refresh_segment_list (struct task_struct *p);
int xen_segment_create(xv_disk_t *xvd);
unsigned short segment_number,
unsigned long sect_nr, unsigned long buffer, unsigned short nr_sects);
-#define XEN_MAX_SEGMENTS 100 /* total number of segments across all doms */
-
/*
* virtual hard disks
*
int mode; /* UNUSED, RO, or RW */
int domain;
int segment_number; /* segment number for domain */
+ char key[XEN_SEGMENT_KEYSIZE]; /* for the userspace tools in dom0 */
int num_extents; /* number of extents */
extent_t *extents;
} segment_t;
#include <linux/proc_fs.h>
#include <linux/delay.h>
#include <linux/seq_file.h>
+#include <asm/hypervisor-ifs/segment.h>
static struct proc_dir_entry *vhd;
static void *proc_vhd_next(struct seq_file *s, void *v, loff_t *pos)
{
- xen_disk_info_t *data;
+ xen_segment_info_t *data;
if ( pos != NULL )
++(*pos);
static void *proc_vhd_start(struct seq_file *s, loff_t *ppos)
{
loff_t pos = *ppos;
- xen_disk_info_t *data;
+ xen_segment_info_t *data;
data = kmalloc(sizeof(*data), GFP_KERNEL);
xenolinux_control_msg(XEN_BLOCK_PROBE_SEG_ALL, (char *)data, sizeof(*data));
static int proc_vhd_show(struct seq_file *s, void *v)
{
- xen_disk_info_t *data = v;
+ xen_segment_info_t *data = v;
seq_printf (s,
- "%4x %4x %lx\n",
- data->disks[data->count - 1].device,
- data->disks[data->count - 1].type,
- data->disks[data->count - 1].capacity);
+ "%x %x %10.10s %x\n",
+ data->segments[data->count - 1].domain,
+ data->segments[data->count - 1].seg_nr,
+ data->segments[data->count - 1].key,
+ data->segments[data->count - 1].device);
return 0;
}
}
xvd.segment = (int) to_number(string);
+ string = get_string(NULL); /* look for key */
+ if (string == NULL || (*string != 'k' && *string != 'K'))
+ {
+ printk (KERN_ALERT
+ "error: key specifier missing [%s]. should be \"key\".\n",
+ string);
+ goto out;
+ }
+ string = get_string(NULL);
+ if (string == NULL || strlen(string) != XEN_SEGMENT_KEYSIZE)
+ {
+ printk (KERN_ALERT "error: key missing\n");
+ goto out;
+ }
+ memcpy(xvd.key, string, XEN_SEGMENT_KEYSIZE);
+
string = get_string(NULL); /* look for Extents */
if (string == NULL || (*string != 'e' && *string != 'E'))
{
unsigned long num_pgt_updates;
};
-#endif __DOM0_H__ /* __DOM0_H__ */
+#endif /* __DOM0_H__ */